Hallitse datan muokkausta Python Pandas -pivot-taulukoilla. Syväsukellus syntaksiin, edistyneisiin tekniikoihin ja käytännön esimerkkeihin globaalissa data-analyysissä.
Python Pandas Pivot-taulukot: Kattava opas datan muokkaamiseen
Data-analyysin maailmassa kyky tiivistää, yhdistellä ja uudelleenjärjestellä dataa ei ole vain taito – se on supervoima. Raakadata, sen alkuperäisessä muodossaan, muistuttaa usein laajaa, yksityiskohtaista kirjanpitoa. Se on täynnä tietoa, mutta vaikeasti tulkittavissa. Merkityksellisten oivallusten saamiseksi meidän on muutettava tämä kirjanpito ytimekkääksi yhteenvedoksi. Juuri tässä pivot-taulukot ovat erinomaisia, ja Python-ohjelmoijille Pandas-kirjasto tarjoaa tehokkaan ja joustavan työkalun: pivot_table().
Tämä opas on suunniteltu globaalille yleisölle, joka koostuu data-analyytikoista, tutkijoista ja Python-harrastajista. Sukellamme syvälle Pandas-pivot-taulukoiden mekaniikkaan, siirtyen peruskäsitteistä edistyneisiin tekniikoihin. Yhteenvetäisitpä myyntilukuja eri mantereilta, analysoisitpa ilmastodataa eri alueilta tai seuraisitpa hajautetun tiimin projektimittareita, pivot-taulukoiden hallinta muuttaa perusteellisesti tapaa, jolla lähestyt datan tutkimusta.
Mikä tarkalleen ottaen on pivot-taulukko?
Jos olet joskus käyttänyt taulukkolaskentaohjelmistoja, kuten Microsoft Exceliä tai Google Sheetsiä, olet todennäköisesti perehtynyt pivot-taulukon käsitteeseen. Se on interaktiivinen taulukko, jonka avulla voit uudelleenjärjestellä ja tiivistää valittuja sarakkeita ja rivejä suuremmasta aineistosta halutun raportin saamiseksi.
Pivot-taulukko tekee kaksi keskeistä asiaa:
- Aggregointi: Se laskee yhteenvedon (kuten summan, keskiarvon tai lukumäärän) numeerisesta tiedosta, joka on ryhmitelty yhden tai useamman kategorian mukaan.
- Muotoilu: Se muuntaa dataa 'pitkästä' muodosta 'leveäksi' muodoksi. Sen sijaan, että kaikki arvot olisivat yhdessä sarakkeessa, se 'kääntää' sarakkeen yksilölliset arvot uusiksi sarakkeiksi tulokseen.
Pandas pivot_table() -funktio tuo tämän tehokkaan toiminnallisuuden suoraan Python-data-analyysityönkulkuusi, mahdollistaen toistettavan, skriptattavan ja skaalautuvan datan muotoilun.
Ympäristön ja esimerkkidatan määrittäminen
Ennen kuin aloitamme, varmista, että sinulla on Pandas-kirjasto asennettuna. Jos ei, voit asentaa sen pipillä, Pythonin pakettienhallinnalla:
pip install pandas
Tuodaan se nyt Python-skriptiimme tai muistikirjaan:
import pandas as pd
import numpy as np
Globaalin myyntidatan luominen
Jotta esimerkkimme olisivat käytännöllisiä ja globaalisti merkityksellisiä, luomme synteettisen aineiston, joka edustaa monikansallisen verkkokauppayrityksen myyntidataa. Tämä aineisto sisältää tietoja myynnistä eri alueilta, maista ja tuotekategorioista.
# Create a dictionary of data
data = {
'TransactionID': range(1, 21),
'Date': pd.to_datetime([
'2023-01-15', '2023-01-16', '2023-01-17', '2023-02-10', '2023-02-11',
'2023-02-12', '2023-03-05', '2023-03-06', '2023-03-07', '2023-01-20',
'2023-01-21', '2023-02-15', '2023-02-16', '2023-03-10', '2023-03-11',
'2023-01-18', '2023-02-20', '2023-03-22', '2023-01-25', '2023-02-28'
]),
'Region': [
'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'Europe',
'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Asia', 'Europe', 'North America', 'Europe', 'Asia'
],
'Country': [
'USA', 'Germany', 'Japan', 'Canada', 'France', 'India', 'USA', 'UK', 'China', 'Germany',
'Japan', 'USA', 'France', 'India', 'Canada', 'China', 'UK', 'USA', 'Germany', 'India'
],
'Product_Category': [
'Electronics', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Electronics', 'Apparel',
'Apparel', 'Books', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Books', 'Electronics', 'Electronics'
],
'Units_Sold': [10, 5, 8, 20, 7, 12, 15, 9, 25, 6, 30, 11, 18, 22, 14, 28, 4, 16, 13, 10],
'Unit_Price': [1200, 50, 900, 15, 60, 1100, 18, 950, 45, 55, 12, 1300, 20, 40, 1250, 14, 65, 16, 1150, 1050]
}
# Create DataFrame
df = pd.DataFrame(data)
# Calculate Revenue
df['Revenue'] = df['Units_Sold'] * df['Unit_Price']
# Display the first few rows of the DataFrame
print(df.head())
Tämä tietokanta antaa meille vankan pohjan kategorisesta datasta (Region, Country, Product_Category), numeerisesta datasta (Units_Sold, Revenue) ja aikasarjadatasta (Date).
pivot_table()-funktion anatomia
Pandas pivot_table() -funktio on uskomattoman monipuolinen. Käydään läpi sen tärkeimmät parametrit:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: DataFrame, jonka haluat pivotoida.
- values: Sarake(sarakkeet), joka sisältää yhdisteltävän datan. Jos tätä ei määritetä, käytetään kaikkia jäljellä olevia numeerisia sarakkeita.
- index: Sarake(sarakkeet), jonka yksilölliset arvot muodostavat uuden pivot-taulukon rivit. Tätä kutsutaan joskus "ryhmittelyavaimeksi".
- columns: Sarake(sarakkeet), jonka yksilölliset arvot "käännetään" uusiksi sarakkeiksi uudessa taulukossa.
- aggfunc: Aggregointifunktio, jota sovelletaan 'values'-arvoihin. Tämä voi olla merkkijono, kuten 'sum', 'mean', 'count', 'min', 'max', tai funktio, kuten
np.sum. Voit myös antaa luettelon funktioista tai sanakirjan, jolla sovelletaan eri funktioita eri sarakkeisiin. Oletusarvo on 'mean'. - fill_value: Arvo, jolla korvataan kaikki puuttuvat tulokset (NaNs) pivot-taulukossa.
- margins: Totuusarvo. Jos asetettu arvoon
True, se lisää välisummat riveille ja sarakkeille (tunnetaan myös kokonaissummana). - margins_name: Sen rivin/sarakkeen nimi, joka sisältää kokonaissummat, kun
margins=True. Oletusarvo on 'All'.
Ensimmäinen pivot-taulukkosi: Yksinkertainen esimerkki
Aloitetaan yleisellä liiketoimintakysymyksellä: "Mikä on kunkin tuotekategorian tuottama kokonaistulo?"
Vastataksemme tähän, meidän on:
- Käytettävä
Product_Category-saraketta riveinä (index). - Aggregoitava
Revenue-sarake (values). - Käytettävä summaa aggregointifunktionamme (aggfunc).
# Simple pivot table to see total revenue by product category
category_revenue = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
aggfunc='sum')
print(category_revenue)
Tulos:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
Välittömästi meillä on selkeä, ytimekäs yhteenveto. Raaka, 20-rivinen tapahtumaloki on muokattu 3-riviseksi taulukoksi, joka vastaa suoraan kysymykseemme. Tämä on pivot-taulukon perustavanlaatuinen voima.
Sarakkeen ulottuvuuden lisääminen
Laajennetaan tätä nyt. Entä jos haluamme nähdä kokonaistulot tuotekategorioittain, mutta jaoteltuna myös alueittain? Tässä kohtaa columns-parametri tulee mukaan kuvioon.
# Pivot table with index and columns
revenue_by_category_region = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum')
print(revenue_by_category_region)
Tulos:
Region Asia Europe North America Product_Category Apparel 1125.0 625.0 NaN Books 336.0 360.0 488.0 Electronics 13200.0 14550.0 29100.0
Tämä tulos on paljon rikkaampi. Olemme kääntäneet 'Region'-sarakkeen yksilölliset arvot ('Asia', 'Europe', 'North America') uusiksi sarakkeiksi. Voimme nyt helposti vertailla, miten eri tuotekategoriat menestyvät eri alueilla. Näemme myös NaN (Not a Number) -arvon. Tämä osoittaa, että 'Apparel'-myyntiä 'North America' -alueelta ei kirjattu tietojoukkoomme. Tämä on arvokasta tietoa sinänsä!
Edistyneet pivotointitekniikat
Perusasiat ovat tehokkaita, mutta pivot_table()-funktion todellinen joustavuus paljastuu sen edistyneissä ominaisuuksissa.
Puuttuvien arvojen käsittely fill_value-parametrilla
Edellisen taulukkomme NaN on tarkka, mutta raportoinnin tai jatkolaskelmien kannalta voi olla edullisempaa näyttää se nollana. fill_value-parametri tekee tästä helppoa.
# Using fill_value to replace NaN with 0
revenue_by_category_region_filled = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0)
print(revenue_by_category_region_filled)
Tulos:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
Taulukko on nyt siistimpi ja helpompi lukea, erityisesti ei-tekniselle yleisölle.
Työskentely useiden indeksien kanssa (hierarkkinen indeksointi)
Mitä jos sinun on ryhmiteltävä useamman kuin yhden kategorian mukaan riveillä? Esimerkiksi, jaotellaan myynnit Region-alueen mukaan ja sitten Country-maan mukaan kunkin alueen sisällä. Voimme antaa luettelon sarakkeista index-parametriin.
# Multi-level pivot table using a list for the index
multi_index_pivot = pd.pivot_table(df,
values='Revenue',
index=['Region', 'Country'],
aggfunc='sum',
fill_value=0)
print(multi_index_pivot)
Tulos:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandas on automaattisesti luonut MultiIndex-indeksin riveille. Tämä hierarkkinen rakenne on loistava tietojen poraamiseen ja sisäkkäisten suhteiden näkemiseen. Voit soveltaa samaa logiikkaa columns-parametriin luodaksesi hierarkkisia sarakkeita.
Useiden aggregointifunktioiden käyttäminen
Joskus yksi yhteenvetotilasto ei riitä. Saatat haluta nähdä sekä kokonaistulot (summa) että keskimääräisen tapahtuman koon (keskiarvo) jokaiselle ryhmälle. Voit välittää luettelon funktioista aggfunc-parametriin.
# Using multiple aggregation functions
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
Tulos:
sum mean count
Revenue Revenue Revenue
Region
Asia 13108.000000 2184.666667 6
Europe 16575.000000 2762.500000 6
North America 29858.000000 4976.333333 6
Tämä yksittäinen komento antaa meille kattavan yhteenvedon: kokonaistulot, keskimääräiset tulot per tapahtuma ja tapahtumien lukumäärän kullekin alueelle. Huomaa, kuinka Pandas luo hierarkkisia sarakkeita pitääkseen tuloksen järjestettynä.
Eri funktioiden soveltaminen eri arvoihin
Voit mennä vieläkin tarkemmaksi. Kuvittele, että haluat nähdä Revenue-sarakkeen summan, mutta Units_Sold-sarakkeen keskiarvon. Voit välittää sanakirjan aggfunc-parametriin, jossa avaimet ovat sarakkeiden nimiä ('values') ja arvot ovat haluttuja aggregointifunktioita.
# Different aggregations for different values
dict_agg_pivot = pd.pivot_table(df,
index='Region',
values=['Revenue', 'Units_Sold'],
aggfunc={
'Revenue': 'sum',
'Units_Sold': 'mean'
},
fill_value=0)
print(dict_agg_pivot)
Tulos:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
Tämä hallinnan taso tekee pivot_table()-funktiosta ensiluokkaisen työkalun kehittyneeseen data-analyysiin.
Kokonaissummien laskeminen margins-parametrilla
Raportoinnissa rivien ja sarakkeiden kokonaissummat ovat usein olennaisia. margins=True-argumentti tarjoaa tämän ilman lisävaivaa.
# Adding totals with margins=True
revenue_with_margins = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total') # Custom name for totals
print(revenue_with_margins)
Tulos:
Region Asia Europe North America Grand Total Product_Category Apparel 1125 625 0 1750 Books 336 360 488 1184 Electronics 13200 14550 29100 56850 Grand Total 14661 15535 29588 59784
Pandas laskee automaattisesti summan jokaiselle riville (kokonaistulot tuotekategorioittain kaikilla alueilla) ja jokaiselle sarakkeelle (kokonaistulot alueittain kaikissa kategorioissa) sekä kokonaissumman kaikelle datalle oikeassa alakulmassa.
Käytännön käyttötapaus: Aikaan perustuva analyysi
Pivot-taulukot eivät rajoitu staattisiin kategorioihin. Ne ovat uskomattoman hyödyllisiä aikasarjadatan analysoinnissa. Etsitään kokonaistulot jokaiselta kuukaudelta.
Ensin meidän on poimittava kuukausi 'Date'-sarakkeestamme. Voimme käyttää Pandasin .dt-accessor-funktiota tähän.
# Extract month from the Date column
df['Month'] = df['Date'].dt.month_name()
# Pivot to see monthly revenue by product category
monthly_revenue = pd.pivot_table(df,
values='Revenue',
index='Month',
columns='Product_Category',
aggfunc='sum',
fill_value=0)
# Optional: Order the months correctly
month_order = ['January', 'February', 'March']
monthly_revenue = monthly_revenue.reindex(month_order)
print(monthly_revenue)
Tulos:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
Tämä taulukko antaa meille selkeän kuvan kunkin kategorian myyntikehityksestä ajan mittaan, mikä mahdollistaa trendien, kausivaihteluiden tai poikkeamien havaitsemisen helposti.
pivot_table() vs. groupby(): Mitä eroa niillä on?
Tämä on yleinen kysymys niille, jotka opiskelevat Pandasia. Nämä kaksi funktiota ovat läheisesti toisiinsa liittyviä, ja itse asiassa pivot_table() on rakennettu groupby()-funktion päälle.
groupby()on yleisempi ja perustavanlaatuisempi operaatio. Se ryhmittelee dataa tiettyjen kriteerien perusteella ja antaa sitten soveltaa aggregointifunktiota. Tulos on tyypillisesti Pandas Series tai DataFrame, jolla on hierarkkinen indeksi, mutta se pysyy 'pitkässä' muodossa.pivot_table()on erikoistunut työkalu, joka tekee ryhmittelyn ja sitten muokkaa dataa. Sen ensisijainen tarkoitus on muuntaa data pitkästä muodosta leveäksi muodoksi, joka on usein helpommin luettavissa ihmisen toimesta.
Palataan ensimmäiseen esimerkkiimme käyttäen groupby()-funktiota:
# Same result as our first pivot table, but using groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
Tulos on Pandas Series, joka on funktionaalisesti vastaava kuin ensimmäisestä pivot-taulukostamme saatu DataFrame. Kuitenkin, kun otetaan käyttöön toinen ryhmittelyavain (kuten 'Region'), ero selkenee.
# Grouping by two columns
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
Tulos (Series MultiIndexillä):
Product_Category Region
Apparel Asia 1125
Europe 625
Books Asia 336
Europe 360
North America 488
Electronics Asia 13200
Europe 14550
North America 29100
Name: Revenue, dtype: int64
Saadaksesi saman 'leveän' muodon kuin pivot_table(index='Product_Category', columns='Region'), sinun tulisi käyttää groupby()-funktiota, jota seuraa unstack():
# Replicating a pivot table with groupby().unstack()
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
Tämä tuottaa täsmälleen saman tuloksen kuin sarakkeilla varustettu pivot-taulukkomme. Voit siis ajatella pivot_table()-funktiota kätevänä pikakuvana yleiselle groupby().aggregate().unstack()-työnkululle.
Milloin käyttää kumpaa?
- Käytä
pivot_table()-funktiota, kun haluat ihmisluettavan, leveämuotoisen tulosteen, erityisesti raportointiin tai ristiintaulukoiden luomiseen. - Käytä
groupby()-funktiota, kun tarvitset enemmän joustavuutta, suoritat välilaskelmia datankäsittelyputkessa tai kun muokattu, leveä muoto ei ole lopullinen tavoitteesi.
Suorituskyky ja parhaat käytännöt
Vaikka pivot_table() on tehokas, on tärkeää käyttää sitä tehokkaasti, erityisesti suurten tietojoukkojen kanssa.
- Suodata ensin, pivot sitten: Jos sinun tarvitsee analysoida vain osajoukko datastasi (esim. viime vuoden myynti), suodata DataFrame ennen pivot-taulukon soveltamista. Tämä vähentää tiedon määrää, jota funktion on käsiteltävä.
- Käytä kategorisia tyyppejä: Sarakkeille, joita käytät usein indeksinä tai sarakkeina pivot-taulukoissasi (kuten 'Region' tai 'Product_Category'), muunna ne 'category'-tyyppisiksi Pandasissa. Tämä voi vähentää merkittävästi muistin käyttöä ja nopeuttaa ryhmittelyoperaatioita.
df['Region'] = df['Region'].astype('category') - Pidä se luettavana: Vältä pivot-taulukoiden luomista, joissa on liian monta indeksiä ja saraketta. Vaikka se on mahdollista, satojen sarakkeiden ja tuhansien rivien pivot-taulukosta voi tulla yhtä lukukelvoton kuin alkuperäisestä raakadatoista. Käytä sitä kohdennettujen yhteenvetojen luomiseen.
- Ymmärrä aggregointi: Ole tietoinen
aggfunc-valinnastasi. "Summan" käyttäminen hintoihin ei ole järkevää, kun taas "keskiarvo" saattaa olla sopivampi. Varmista aina, että aggregointisi vastaa kysymystä, johon yrität vastata.
Yhteenveto: Työkalusi oivaltaviin yhteenvetoihin
Pandas pivot_table() -funktio on välttämätön työkalu jokaisen data-analyytikon työkalupakissa. Se tarjoaa deklaratiivisen, ilmaisuvoimaisen ja tehokkaan tavan siirtyä sotkuisesta, yksityiskohtaisesta datasta puhtaisiin, oivaltaviin yhteenvedoihin. Ymmärtämällä ja hallitsemalla sen ydinkomponentit – values, index, columns ja aggfunc – ja hyödyntämällä sen edistyneitä ominaisuuksia, kuten monitasoista indeksointia, mukautettuja aggregointitoimintoja ja marginaaleja, voit muokata dataasi vastataksesi monimutkaisiin liiketoimintakysymyksiin vain muutamalla rivillä Python-koodia.
Seuraavan kerran kun kohtaat suuren tietojoukon, vastusta kiusausta selata loputtomia rivejä. Ajattele sen sijaan kysymyksiä, joihin sinun on vastattava, ja miten pivot-taulukko voi muokata dataasi paljastamaan sen sisällä piilevät tarinat. Iloista pivotointia!